package com.ruoyi.app.util;

import lombok.extern.slf4j.Slf4j;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Optional;

@Slf4j
public class BigDecimalCompareUtils {

    /**
     * 判断 num1 是否大于 num2
     * @param num1 要比较的第一个 BigDecimal 对象
     * @param num2 要比较的第二个 BigDecimal 对象
     * @return 如果 num1 大于 num2 返回 true，否则返回 false
     */
    public static boolean isGreaterThan(BigDecimal num1, BigDecimal num2) {
        return Optional.ofNullable(num1)
                .filter(n1 -> Optional.ofNullable(num2).map(n2 -> n1.compareTo(n2) > 0).orElse(false))
                .isPresent();
    }

    /**
     * 判断 num1 是否大于等于 num2
     * @param num1 要比较的第一个 BigDecimal 对象
     * @param num2 要比较的第二个 BigDecimal 对象
     * @return 如果 num1 大于等于 num2 返回 true，否则返回 false
     */
    public static boolean isGreaterThanOrEqual(BigDecimal num1, BigDecimal num2) {
        return Optional.ofNullable(num1)
                .filter(n1 -> Optional.ofNullable(num2).map(n2 -> n1.compareTo(n2) >= 0).orElse(false))
                .isPresent();
    }

    /**
     * 判断 num1 是否小于 num2
     * @param num1 要比较的第一个 BigDecimal 对象
     * @param num2 要比较的第二个 BigDecimal 对象
     * @return 如果 num1 小于 num2 返回 true，否则返回 false
     */
    public static boolean isLessThan(BigDecimal num1, BigDecimal num2) {
        return Optional.ofNullable(num1)
                .filter(n1 -> Optional.ofNullable(num2).map(n2 -> n1.compareTo(n2) < 0).orElse(false))
                .isPresent();
    }

    /**
     * 判断 num1 是否小于等于 num2
     * @param num1 要比较的第一个 BigDecimal 对象
     * @param num2 要比较的第二个 BigDecimal 对象
     * @return 如果 num1 小于等于 num2 返回 true，否则返回 false
     */
    public static boolean isLessThanOrEqual(BigDecimal num1, BigDecimal num2) {
        return Optional.ofNullable(num1)
                .filter(n1 -> Optional.ofNullable(num2).map(n2 -> n1.compareTo(n2) <= 0).orElse(false))
                .isPresent();
    }

    /**
     * 判断 num1 是否等于 num2
     * @param num1 要比较的第一个 BigDecimal 对象
     * @param num2 要比较的第二个 BigDecimal 对象
     * @return 如果 num1 等于 num2 返回 true，否则返回 false
     */
    public static boolean isEqual(BigDecimal num1, BigDecimal num2) {
        return Optional.ofNullable(num1)
                .filter(n1 -> Optional.ofNullable(num2).map(n2 -> n1.compareTo(n2) == 0).orElse(false))
                .isPresent();
    }

    /**
     * 计算折扣金额
     * @param productPrice 商品金额
     * @param discountRate 折扣率
     * @return 折扣金额
     */
    public static BigDecimal calculateDiscountAmount(BigDecimal productPrice, BigDecimal discountRate) {
        if (productPrice == null || discountRate == null) {
            return BigDecimal.ZERO;
        }
        log.info("========计算折扣金额=====discountRate:{}",discountRate);
        log.info("========计算折扣金额=====productPrice:{}",productPrice);
        // 折扣值，这里假设 8 表示 8 折，即 0.8
        discountRate = discountRate.divide(new BigDecimal("10"));
        // 计算折扣金额
        BigDecimal result = productPrice.multiply(new BigDecimal(1).subtract(discountRate));
        log.info("========计算折扣金额=====result:{}",result);
        // 设置精度为 2 位小数，采用四舍五入的舍入模式
        result.setScale(2, BigDecimal.ROUND_HALF_UP);
        log.info("========计算折扣金额设置精度=====result:{}",result);
        return result;
    }
}
